<?php

class News
{
    const STATUS_NEW     = 0;
    const STATUS_ACTIVE  = 1;
    const STATUS_BLOCKED = 2;
    
    /**
     * @var int
     */
    private $id;
    
    /**
     * Уникальный хеш новости
     * 
     * @var string
     */
    protected $hash;
    
    /**
     * @var string
     */
    private $title;
    
    /**
     * @var string
     */
    private $description;
    
    /**
     * @var string
     */
    private $image;
    
    /**
     * @var string
     */
    private $date;
    
    /**
     * @var int
     */
    private $status;
    
    /**
     * @var string
     */
    private $link;
    
    /**
     * Дата публикации на сайте
     *
     * @var string
     */
    private $pubdate;
    
    /**
     * Дата публикации на сайте для вывода на экран
     *
     * @var string
     */
    private $pubdate_str;
    
    /**
     * @var int
     */
    protected $rss_id;
    
    /**
     * Источник новости
     *
     * @var string
     */
    protected $source;
    
    /**
     * ссылка в виде транслита
     *
     * @var string
     */
    protected $words_url;
    
    /**
     * хеш от $words_url
     *
     * @var string
     */
    protected $words_url_hash;
    
    /**
     * Инициализация класса
     *
     * @param int $id
     * @param string $title
     * @param string $hash
     * @param string $description
     * @param string $image
     * @param int $status
     * @param string $date
     * @param string $link
     * @param string $pubdate
     * @param int $rss_id
     * @param string $words_url
     */
    public function __construct($id = null, $title = null, $hash = null, $description = null, $image = null, $status = null, $date = null, $link = null, $pubdate = null, $rss_id = null, $words_url = null)
    {
        $this->setId($id);
        $this->setTitle($title);
        $this->setImage($image);
        $this->setStatus($status);
        $this->setDescription($description);
        $this->setDate($date);
        $this->setLink($link);
        $this->setPubdate($pubdate);
        $this->setHash($hash);
        $this->setRssId($rss_id);
        $this->setWordsUrl($words_url);
    }
    
    /**
     * @return string
     */
    public function getDate()
    {
        return $this->date;
    }
    
    /**
     * @return string
     */
    public function getDescription()
    {
        return $this->description;
    }
    
    /**
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }
    
    /**
     * @return string
     */
    public function getImage()
    {
        return $this->image;
    }
    
    /**
     * @return int
     */
    public function getStatus()
    {
        return $this->status;
    }
    
    /**
     * @return string
     */
    public function getTitle()
    {
        return $this->title;
    }
    
    /**
     * @param string $date
     */
    public function setDate($date)
    {
        $this->date = $date;
    }
    
    /**
     * @param string $description
     */
    public function setDescription($description)
    {
        $this->description = $description;
    }
    
    /**
     * @param int $id
     */
    public function setId($id)
    {
        $this->id = $id;
    }
    
    /**
     * @param string $image
     */
    public function setImage($image)
    {
        $this->image = $image;
    }
    
    /**
     * @param int $status
     */
    public function setStatus($status)
    {
        $this->status = $status;
    }
    
    /**
     * @param string $title
     */
    public function setTitle($title)
    {
        $this->title = $title;
    }
    
    /**
     * @return string
     */
    public function getLink()
    {
        return $this->link;
    }
    
    /**
     * @return string
     */
    public function getPubdate()
    {
        return $this->pubdate;
    }
    
    public function getPubdateStr()
    {
        if ($this->getPubdate()) {
            $pubdate_timestamp = strtotime($this->getPubdate());
            $now_timestamp = time();
            /**
             * если меньше часа - ЧЧ.ММ (n мин. назад)
             * если меньше 24 часов - выводить ЧЧ:ММ (n ч. назад)
             * если меньше 48 - выводить: ДД.ММ.ГГ (вчера)
             * если меньше 7 дней назад: ДД.ММ.ГГ (n дней назад)
             * если дата неделя и раньше - ДД.ММ.ГГ ЧЧ.ММ
             */
            
            if (round(($now_timestamp - $pubdate_timestamp) / 60) > 60 * 24 * 6) { // больше недели (6 дней * 24 часа * 60 минут)
                $this->pubdate_str = date("d.m.y H:i", $pubdate_timestamp);
            } elseif (round(($now_timestamp - $pubdate_timestamp) / 60) > 60 * 24) { // больше 2 дней
                $this->pubdate_str = date("d.m.y (".date("j", time() - $pubdate_timestamp)." дн. назад)", $pubdate_timestamp);
            } elseif (round(($now_timestamp - $pubdate_timestamp) / 60) > 60 * 24) { // больше дня
                $this->pubdate_str = date("H:i (вчера)", $pubdate_timestamp);
            } elseif (round(($now_timestamp - $pubdate_timestamp) / 60) > 60) { // больше часа
                $this->pubdate_str = date("H:i (".round(($now_timestamp - $pubdate_timestamp) / 60 / 60)." ч. назад)", $pubdate_timestamp);
            } else { // в течение часа
                $this->pubdate_str = date("H:i (".round(($now_timestamp - $pubdate_timestamp) / 60)." мин. назад)", $pubdate_timestamp);
            }
        }
        return $this->pubdate_str;
    }
    
    /**
     * @param string $link
     */
    public function setLink($link)
    {
        $this->link = $link;
    }
    
    /**
     * @param string $pubdate
     */
    public function setPubdate($pubdate)
    {
        $this->pubdate = $pubdate;
    }
    
    /**
     * @return string
     */
    public function getHash()
    {
        return $this->hash;
    }
    
    /**
     * @param string $hash
     */
    public function setHash($hash)
    {
        $this->hash = $hash;
    }
    
    /**
     * @return int
     */
    public function getRssId()
    {
        return intval($this->rss_id);
    }
    
    /**
     * Возвращает URL rss
     *
     * @return string
     */
    public function getRssUrl()
    {
        $rss = new RssModel();
        $r = $rss->get($this->getRssId());
        
        if (is_object($r)) {
            return $r->getUrl();
        }
        return '';
    }
    
    /**
     * @param int $rss_id
     */
    public function setRssId($rss_id)
    {
        $this->rss_id = intval($rss_id);
    }
    
    /**
     * Возвращает сайт-источник новости
     * Берется из ссылки на новость
     * 
     * @return string
     */
    public function getSource()
    {
        if (empty($this->source) && $this->getLink()) {
            $matches = array();
            if (preg_match('/^http\:\/\/(?:www\.)?([^\/]+)\/?.*/iu', $this->getLink(), $matches)) {
                $this->source = $matches[1];
            }
        }
        return $this->source;
    }
    
    /**
     * @return string
     */
    public function getWordsUrl()
    {
        return $this->words_url;
    }
    
    /**
     * @param string $words_url
     */
    public function setWordsUrl($words_url)
    {
        $this->words_url = $words_url;
        $this->setWordsUrlHash();
    }
    
    /**
     * @return string
     */
    public function getWordsUrlHash()
    {
        return $this->words_url_hash;
    }
    
    /**
     * @param string $words_url_hash
     */
    private function setWordsUrlHash()
    {
        $this->words_url_hash = md5($this->getWordsUrl());
    }
    
    /**
     * Вычисляет внутренний урл для новости
     *
     * @return string
     */
    public function getGeneratedUrl()
    {
        return '/news/' . ($this->getWordsUrl() ? $this->getWordsUrl() : $this->getId()) . '/';
    }
    
    /**
     * Вычисляет исходящий урл на новость
     * 
     * @return string
     */
    public function getOutUrl()
    {
        return '/out/' . ($this->getWordsUrl() ? $this->getWordsUrl() : $this->getId()) . '/';
    }
}